/*
* 定义函数或类时如果遇到类型不明确就可以使用泛型
* 泛型可以指定多个
* */
function fn<T>(a: T): T {
    return a
}
// 可以直接调用具有泛型的函数
let result = fn(10)   // 不指定泛型，TS自动推断，但并不是所有情况都可以推断出
let result2 = fn<string>('hello')  // 指定泛型
function fn2<T, K>(a: T, b: K): T {
    console.log(b)
    return a
}
fn2(123, 'hello')
fn2<number, string>(123, 'hello')
interface Inter {
    length: number
}
// T extends Inter  表示泛型T必须是Inter的实现类（子类）
function fn3<T extends Inter>(a: T): number {
    return a.length
}
// fn3('123')
// fn3(12)   // ts报错
// fn3({
//     name: 123,
//     length: 123
// })
class MyClass<Y> {
    name: Y
    constructor(name: Y) {
        this.name = name
    }
}
const mc = new MyClass<string>('小明')
